# ======================
# 编译器设置
# ======================
CXX = g++
# 编译选项：C++17标准、显示所有警告、包含路径
CXXFLAGS = -std=c++17 -Wall -Wextra -g -I/usr/include/jsoncpp -I../../include -I../lib
# 链接选项：库路径和依赖库
LDFLAGS = -L/usr/local/lib -lmysqlcppconn -ljsoncpp -lpthread 

# ======================
# 目录结构设置
# ======================
# 主源码目录
SRC_DIR = ./src
# 数据库相关源码目录
SRC_DB = $(SRC_DIR)/database
# 处理器相关源码目录
SRC_HANDLERS = $(SRC_DIR)/handlers
# 配置目录
CONFIG_DIR = ./config

# ======================
# 文件查找规则
# ======================
# 自动查找所有.cpp和.cc源文件
SRCS = \
	$(SRC_DIR)/main.cpp \
	$(wildcard $(SRC_DB)/*.cpp) $(wildcard $(SRC_DB)/*.cc) \
	$(wildcard $(SRC_HANDLERS)/*.cpp) $(wildcard $(SRC_HANDLERS)/*.cc)

# 生成对应的.o文件列表
OBJS = $(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SRCS)))

# ======================
# 构建目标设置
# ======================
# 最终可执行文件名
TARGET = food_order_server

# ======================
# 构建规则
# ======================
# 默认构建目标（带彩色成功提示）
all: $(TARGET)
	@echo "\n\033[32mBuild completed successfully\033[0m"

# 链接规则：将所有.o文件链接为可执行文件
$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

# 通用编译规则（支持.cpp文件）
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 通用编译规则（支持.cc文件）
%.o: %.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@

# ======================
# 实用目标
# ======================
# 运行目标（带启动提示）
run: $(TARGET)
	@echo "\033[34mStarting server with config from $(CONFIG_DIR)...\033[0m"
	@./$(TARGET)

# 测试目标（新增）
test: $(TARGET)
	@echo "\033[33mRunning tests...\033[0m"
	./$(TARGET) --test

# 清理构建文件
clean:
	@echo "\033[33mCleaning build files...\033[0m"
	rm -f $(OBJS) $(TARGET)

# 深度清理（包括依赖文件）
distclean: clean
	@echo "\033[33mRemoving dependency files...\033[0m"
	rm -f .depend

# 生成依赖关系（首次构建时执行）
dep:
	@echo "\033[33mGenerating dependencies...\033[0m"
	$(CXX) -MM $(CXXFLAGS) $(SRCS) > .depend

# 包含自动生成的依赖关系
-include .depend

# ======================
# 伪目标声明
# ======================
.PHONY: all clean run test distclean dep